package cn.itcast.method_function

/**
  * @Package cn.itcast.method_function
  * @author KTL
  * @date 2021/5/15 0015 10:46
  * @version V1.0
  * @Copyright © 2015-04-29  One for each, and two for each
  *           Desc 演示scala函数定义格式
  *           函数的本质是对象
  */
object Demo4_FunctionIsObject {

  def main(args: Array[String]): Unit = {

    val fun =(a:Int,b:Int)=>{a+b}
    //证明1：函数是对象，可以赋值给变量
    val fun2 =fun

    //证明2：函数时对象，可以打点调用方法
    println(fun.toString())

    //证明3：函数是对象可以传递给方法的参数来接收
    println(getFunction(1, 2, fun))


    //拓展：方法和函数功能一样，所以方法也可以转函数
    println(getFunction(1,2,add))

    //拓展：为什么有了方法还需要函数 ？
    // 函数的优势：简洁、功能灵活
    //如：完成4则运算，方法要定义4个，而使用函数式编程，函数可以直接传，无需单独定义，功能灵活
    print(getFunction(1,2,(a,b)=>a+b))
    print(getFunction(1,2,(a,b)=>a-b))
    print(getFunction(1,2,(a,b)=>a*b))
    print(getFunction(1,2,(a,b)=>a/b))

  }
  /**
    * 定义一个方法，接受两个int值，在方法体将两个int值传给函数
    * @param a
    * @param b
    * @param fun
    * @return
    */
  def getFunction(a:Int,b:Int,fun:(Int,Int)=>Int): Int ={
    fun(a,b)
}

  def add (a:Int,b:Int):Int={
    a+b
  }

}
